package br.org.acessobrasil.processoacessibilidade.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import org.springframework.transaction.annotation.Transactional;

import br.org.acessobrasil.processoacessibilidade.vo.ErroOuAvisoPro;
import br.org.acessobrasil.processoacessibilidade.vo.ErrosRegraPro;
import br.org.acessobrasil.processoacessibilidade.vo.RelatorioAcessibilidadePro;
import br.org.acessobrasil.processoacessibilidade.vo.SitioPro;

@Transactional
public class RelatorioDao extends SuperDao<RelatorioAcessibilidadePro>{

	@Override
	public RelatorioAcessibilidadePro find(long id) {
		return (RelatorioAcessibilidadePro)getEntityManager().find(RelatorioAcessibilidadePro.class, id);
	}

	public List<RelatorioAcessibilidadePro> listarRelatorios(SitioPro sitio,Date dataGerada) throws Exception {
		Query q = getEntityManager().createQuery("Select r From RelatorioAcessibilidadePro r left join fetch r.listErroP1 " +
				" where r.dataGerada=:dataGerada and r.pagina.idSitio=:idSitio ");
		q.setParameter("dataGerada", dataGerada);
		q.setParameter("idSitio", sitio.getId());
		List<RelatorioAcessibilidadePro>relatorios = q.getResultList();
		//fetch
		int tot = relatorios.size();
		for(int i=0;i<tot;i++){
			relatorios.get(i).getListAvisoP1().size();
			relatorios.get(i).getListAvisoP2().size();
			relatorios.get(i).getListAvisoP3().size();
			relatorios.get(i).getListErroP2().size();
			relatorios.get(i).getListErroP3().size();
			relatorios.get(i).getListErroXHTML().size();
		}
		return relatorios;
	}
	/**
	 * 
	 * @return lista consertada
	 * @throws Exception
	 */
	private List<RelatorioAcessibilidadePro> arrumarRelatorios() throws Exception {
		List<RelatorioAcessibilidadePro>relatorios = getEntityManager().createQuery("Select r From RelatorioAcessibilidadePro r left join fetch r.listErroP2 left join r.listErroP3").getResultList();
		//*
		int adicionado = 0;
		int totP2 = 0;
		int p3emP2 = 0;
		for(RelatorioAcessibilidadePro relatorio:relatorios){
			for(ErrosRegraPro erroRegraP2:relatorio.getListErroP2()){
				boolean tentarNovamente = true;
				while(tentarNovamente){
					tentarNovamente = false;
					for(ErroOuAvisoPro erro:erroRegraP2.getListOcorrencia()){
						totP2++;
						if(erro.getCodTextoRegra().startsWith("3.")){
							p3emP2++;
							ErroOuAvisoPro erroNovo = erro.asNew();
							//procurar regra igual
							boolean achou = false;
							for(ErrosRegraPro erroRegra3:relatorio.getListErroP3()){
								if(erroRegra3.getCodigo().equals(erro.getCodTextoRegra())){
									achou = true;
									erroRegra3.getListOcorrencia().add(erroNovo);
									adicionado++;
									break ;
								}
							}
							if(!achou){
								//criar um novo
								ErrosRegraPro erroR =  new ErrosRegraPro();
								erroR.setCodigo(erro.getCodTextoRegra());
								erroR.setTexto(erroRegraP2.getTexto());
								ArrayList<ErroOuAvisoPro> listEA = new ArrayList<ErroOuAvisoPro>();
								listEA.add(erroNovo);
								erroR.setListOcorrencia(listEA);
								relatorio.getListErroP3().add(erroR);
								adicionado++;
							}
							erroRegraP2.getListOcorrencia().remove(erro);
							getEntityManager().remove(erro);
							tentarNovamente = true;
							break;
						}
					}//fim for
				}
			}
		}
		System.out.println("Adicionados "  + adicionado);
		System.out.println("p3emP2 "  + p3emP2);
		System.out.println("TotP2 "  + totP2);
		int totRemovido =0;
		for(RelatorioAcessibilidadePro relatorio:relatorios){
			for(ErrosRegraPro erroRegra:relatorio.getListErroP2()){
				boolean achou = true;
				while(achou){
					achou = false;
					for(ErroOuAvisoPro erro:erroRegra.getListOcorrencia()){
						if(erro.getCodTextoRegra().startsWith("3.")){
							erroRegra.getListOcorrencia().remove(erro);
							achou = true;
							totRemovido++;
							break;
						}
					}
				}
			}
			getEntityManager().merge(relatorio);
		}
		System.out.println("totRemovido "  +totRemovido);
		//*/
		return relatorios;
	}
	public void carregarErroP3(RelatorioAcessibilidadePro relatorio){
		Query q = getEntityManager().createQuery("Select r.listErroP3 From RelatorioAcessibilidadePro r where r.idRelatorio=:idRelatorio");
		q.setParameter("idRelatorio",relatorio.getIdRelatorio());
		relatorio.setListErroP3(q.getResultList());
	}

	public Date getUltimaData(SitioPro sitio) {
		Query q = getEntityManager().createQuery("Select r From RelatorioAcessibilidadePro r where r.pagina.idSitio=:idSitio order by r.dataGerada desc limit 1");
		q.setParameter("idSitio", sitio.getId());
		List<RelatorioAcessibilidadePro> lista = q.getResultList();
		if(lista.size()>0){
			return lista.get(0).getDataGerada();
		}
		return null;
	}
}
